use wgpu_test::{fail, gpu_test, valid, GpuTestConfiguration, GpuTestInitializer, TestParameters};

pub fn all_tests(vec: &mut Vec<GpuTestInitializer>) {
    vec.extend([BAD_BUFFER, BAD_TEXTURE]);
}

#[gpu_test]
static BAD_BUFFER: GpuTestConfiguration = GpuTestConfiguration::new()
    .parameters(TestParameters::default().enable_noop())
    .run_sync(|ctx| {
        // Create a buffer with bad parameters and call a few methods.
        // Validation should fail but there should be not panic.
        let buffer = fail(
            &ctx.device,
            || {
                ctx.device.create_buffer(&wgpu::BufferDescriptor {
                    label: None,
                    size: 99999999,
                    usage: wgpu::BufferUsages::MAP_READ | wgpu::BufferUsages::STORAGE,
                    mapped_at_creation: false,
                })
            },
            Some("`map` usage can only be combined with the opposite `copy`"),
        );

        fail(
            &ctx.device,
            || buffer.slice(..).map_async(wgpu::MapMode::Write, |_| {}),
            Some("Buffer with '' label is invalid"),
        );
        fail(
            &ctx.device,
            || buffer.unmap(),
            Some("Buffer with '' label is invalid"),
        );
        valid(&ctx.device, || buffer.destroy());
        valid(&ctx.device, || buffer.destroy());
    });

#[gpu_test]
static BAD_TEXTURE: GpuTestConfiguration = GpuTestConfiguration::new()
    .parameters(TestParameters::default().enable_noop())
    .run_sync(|ctx| {
        let texture = fail(
            &ctx.device,
            || {
                ctx.device.create_texture(&wgpu::TextureDescriptor {
                    label: None,
                    size: wgpu::Extent3d {
                        width: 0,
                        height: 12345678,
                        depth_or_array_layers: 9001,
                    },
                    mip_level_count: 2000,
                    sample_count: 27,
                    dimension: wgpu::TextureDimension::D2,
                    format: wgpu::TextureFormat::Rgba8UnormSrgb,
                    usage: wgpu::TextureUsages::all(),
                    view_formats: &[],
                })
            },
            Some("dimension x is zero"),
        );

        fail(
            &ctx.device,
            || {
                let _ = texture.create_view(&wgpu::TextureViewDescriptor::default());
            },
            Some("Texture with '' label is invalid"),
        );
        valid(&ctx.device, || texture.destroy());
        valid(&ctx.device, || texture.destroy());
    });
